<?php

class LokasisController extends \BaseController {

	/**
	 * Display a listing of lokasis
	 *
	 * @return Response
	 */
	public function index()
	{
		$lingkungan = Lingkungan::active()->first()->toArray();

		$lokasis = DB::table('lokasis')->leftJoin('tipes', 'tipes.id', '=', 'lokasis.tipe_id')->where('lokasis.is_active', '=', '1')->orderBy('lokasis.nama', 'ASC')->get(array('lokasis.*', 'tipes.nama AS nama_tipe'));
		return View::make('lokasis.index')->with(compact('lokasis'))->with(compact('lingkungan'));
	}

	/**
	 * Show the form for creating a new lokasi
	 *
	 * @return Response
	 */
	public function create()
	{
		$lingkungan = Lingkungan::active()->first()->toArray();
		$tipes      = array('' => '- - Pilih Jenis - -') + Tipe::where('is_active', '=', '1')->orderBy('nama','ASC')->lists('nama','id');			
		$penduduks  = Penduduk::active()->orderBy('nama','ASC')->get();				

		return View::make('lokasis.create')
					->with(compact('tipes'))
					->with(compact('lingkungan'))
					->with(compact('penduduks'));
	}

	/**
	 * Store a newly created lokasi in storage.
	 *
	 * @return Response
	 */
	public function store()
	{
		$validator = Validator::make($data = Input::all(), Lokasi::$rules);

		if ($validator->fails())
		{
			$messages = $validator->messages()->all();
            return Response::json(['type' => 'error', 'msg' => $messages]);
		}

		$lokasi = Lokasi::create($data);

		$lokasi->ref_id = $lokasi->id;
		$lokasi->save();

		if($lokasi->save()) {
			return Response::json(['type' => 'success', 'msg' => 'Simpan sukses']);
		}else{
			return Response::json(['type' => 'error', 'msg' => 'Simpan gagal']);
		}		
	}

	/**
	 * Display the specified lokasi.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function show($id)
	{
		$lokasi             = Lokasi::findOrFail($id);		
		$penduduks_by_no_kk = array();
		$pemilik            = Penduduk::findOrFail($lokasi->penduduk_id);
		$tamus              = Tamu::active()->where('lokasi_id', '=', $lokasi->id)->get();
		$kipems             = Kipem::active()->where('lokasi_id', '=', $lokasi->id)->get();		
		$stlds              = Stld::active()->where('lokasi_id', '=', $lokasi->id)->get();


		$no_kks = DB::table('penduduks')
					->join('lokasi_penduduk', 'penduduks.id', '=', 'lokasi_penduduk.penduduk_id')														
					->select(array('penduduks.no_kk'))
					->groupBy('penduduks.no_kk')
					->get();																

		foreach ($no_kks as $no_kk) {			
			$temp = array();
			foreach ($lokasi->penduduks as $penduduk) {				
				if($penduduk->no_kk == $no_kk->no_kk) {					
					array_push($temp, $penduduk);
				}
			}			
			array_push($penduduks_by_no_kk, $temp);			
		}				

		return View::make('lokasis.show')
			->with(compact('lokasi'))
			->with(compact('penduduks_by_no_kk'))
			->with(compact('pemilik'))
			->with(compact('tamus'))
			->with(compact('kipems'))
			->with(compact('stlds'));
	}

	/**
	 * Show the form for editing the specified lokasi.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function edit($id)
	{
		$lokasi    = Lokasi::find($id);
		$pemilik   = Penduduk::findOrFail($lokasi->penduduk_id);				
		$tipes     = array('' => '- - Pilih Jenis - -') + Tipe::where('is_active', '=', '1')->orderBy('nama','ASC')->lists('nama','id');;
		$penduduks = Penduduk::active()->orderBy('nama','ASC')->get();				

		return View::make('lokasis.edit')
					->with(compact('lokasi'))
					->with(compact('tipes'))
					->with(compact('penduduks'))
					->with(compact('pemilik'));
	}

	/**
	 * Update the specified resource in storage.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function update($id)
	{
		$lokasi = Lokasi::findOrFail($id);

		$validator = Validator::make($data = Input::all(), Lokasi::$rules);

		if ($validator->fails())
		{
			return Redirect::back()->withErrors($validator)->withInput();
		}

		Lokasi::create($data);				
		
		$lokasi->is_active = 0;				

		if($lokasi->save()) {
			return Response::json(['type' => 'success', 'msg' => 'Simpan sukses']);
		}else{
			return Response::json(['type' => 'error', 'msg' => 'Simpan gagal']);
		}		
	}

	/**
	 * Remove the specified resource from storage.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function destroy($id)
	{
		$lokasi = Lokasi::findOrFail($id);
		$lokasi->is_active = 0;
		$lokasi->user_id = Auth::user()->id;
		$lokasi->action = 3;
		if($lokasi->save()) {
			return Response::json(['type' => 'success', 'msg' => 'Hapus sukses']);
		}else{
			return Response::json(['type' => 'error', 'msg' => 'Hapus gagal']);
		}
	}

	public function pendudukpenjamin()
	{
		$id = Input::get('id');
		$penjamin = Lokasi::findOrFail($id)->penduduks()->where('penduduks.is_active', '1')->get();

		return $penjamin;
	}

	public function datatableIndex()
	{		
		$lokasi = DB::table('lokasis')
					->leftJoin('tipes', 'tipes.id', '=', 'lokasis.tipe_id')
					->join('penduduks', 'penduduks.id', '=', 'lokasis.penduduk_id')
					->where('lokasis.is_active', '=', '1')->orderBy('lokasis.nama', 'ASC')
					->select(array(
						'lokasis.id',
						'lokasis.nama',
						'lokasis.lat_lng',
						'tipes.nama AS nama_tipe',
						'lokasis.alamat',
						'lokasis.keterangan',
						'penduduks.nama AS nama_pemilik'
					));
		return Datatables::of($lokasi)
		->add_column('operations', 
			'<div class="btn-group">
				<a href="{{ URL::route(\'lokasis.penduduk\', $id) }}" class="btn btn-default btn-tooltip" data-toggle="tooltip" data-placement="top" data-original-title="Penduduk"><i class="fa fa-user text-info"></i></a>
				<a href="{{ URL::route(\'lokasis.show\', $id) }}" class="btn btn-default btn-tooltip btn-detail" data-lat_lng="{{ $lat_lng }}" data-toggle="tooltip" data-placement="top" data-original-title="Detail"><i class="fa fa-list text-success"></i></a>
				<a href="{{ URL::route(\'lokasis.edit\', $id) }}" class="btn btn-default btn-tooltip" data-toggle="tooltip" data-placement="top" data-original-title="Edit"><i class="fa fa-pencil text-warning"></i></a>
				<a href="{{ URL::route(\'lokasis.destroy\', $id) }}" class="btn btn-default btn-tooltip btn-delete" data-toggle="tooltip" data-placement="top" data-original-title="Hapus"><i class="fa fa-times text-danger"></i></a>
			</div>')
		->edit_column('nama', '{{ $nama }} <a class="btn btn-default btn-sm pull-right btn-map" data-lat_lng="{{ $lat_lng }}"><i class="fa fa-map-marker text-success"></i> Peta</a>')
		->make();
	}

	public function penduduk($id)
	{
		$lokasi    = Lokasi::findOrFail($id);
		$penduduks = $lokasi->penduduks;
		$pemilik   = Penduduk::findOrFail($lokasi->penduduk_id);

		return View::make('lokasis.penduduk')
				->with(compact('lokasi'))
				->with(compact('penduduks'))
				->with(compact('pemilik'));
	}

	/**
	 * Show mapped penduduks in certain Lokasi
	 */
	
	public function datatableAllPenduduks($id)
	{		
		$id_penduduks = array();

    	$lokasi_penduduks = DB::table('lokasi_penduduk')
    		->where('lokasi_id', '=', $id)
    		->where('is_active', '=', '1')
    		->select(array('lokasi_penduduk.penduduk_id'))->get();    	

    	foreach ($lokasi_penduduks as $lokasi_penduduk) {    		
    		array_push($id_penduduks, $lokasi_penduduk->penduduk_id);
    	}    	
    	
    	$penduduks = DB::table('penduduks')    					    					
    					->join('jenis_pekerjaans', 'penduduks.jenis_pekerjaan_id', '=', 'jenis_pekerjaans.id')    					    					
    					->join('status_keluargas', 'penduduks.status_keluarga_id', '=', 'status_keluargas.id')    					    					    					    				
    					->select(array(
    						'penduduks.id',
    						'penduduks.nik',
    						'penduduks.no_kk',
    						'penduduks.nama',
    						'penduduks.jenis_kelamin',
    						'jenis_pekerjaans.nama AS jenis_pekerjaan',    						
    						'status_keluargas.nama AS status_keluarga'
    						));

    	if(count($id_penduduks) > 0) {
    		$penduduks = $penduduks->where('penduduks.is_active', '=', '1')->whereIn('penduduks.id', $id_penduduks);
    	}else{
    		$penduduks = $penduduks->where('penduduks.is_active', '=', '99');
    	}
    	if(Input::get('fl_nik') != "") {
    		$penduduks = $penduduks->where('penduduks.nik', 'LIKE', '%'.Input::get('fl_nik').'%');
    	}
    	if(Input::get('fl_no_kk') != "") {
    		$penduduks = $penduduks->where('penduduks.no_kk', 'LIKE', '%'.Input::get('fl_no_kk').'%');	
    	}
    	if(Input::get('fl_jk') != "") {
    		$penduduks = $penduduks->where('penduduks.jenis_kelamin', '=', Input::get('fl_jk'));
    	}
		return Datatables::of($penduduks)
			->add_column('operations', 
			'<div class="btn-group">			
				<a href="#" class="btn btn-default btn-tooltip btn-remove" data-penduduk-id="{{$id}}" data-toggle="tooltip" data-placement="top" data-original-title="Hapus"><i class="fa fa-times text-danger"></i></a>
			</div>')
			->edit_column('no_kk', '<a href="#" class="btn-no-kk">{{$no_kk}}</a>')
			->make();
	}

	/**
     * Partials show in Lokasis Page
     * Mapping Lokasi to Penduduk
     *
     */
    public function datatableAvailablePenduduks($id)
    {       	    	
    	$penduduks = DB::table('penduduks')    					    					
    					->leftJoin('lokasi_penduduk', 'penduduks.id', '=', 'lokasi_penduduk.penduduk_id')    					 					    					
    					->join('jenis_pekerjaans', 'penduduks.jenis_pekerjaan_id', '=', 'jenis_pekerjaans.id')    					    					
    					->join('status_keluargas', 'penduduks.status_keluarga_id', '=', 'status_keluargas.id')       					    					
    					->orWhere(function($query)
            			{
            				$query->whereNull('lokasi_penduduk.lokasi_id');
                			$query->orWhere('lokasi_penduduk.is_active', '=', '0');                      	
            			})	    					
    					->where('penduduks.is_active', '=', '1')    					    					    					    					    				
    					->select(array(
    						'penduduks.id',
    						'penduduks.nik',
    						'penduduks.no_kk',
    						'penduduks.nama',
    						'penduduks.jenis_kelamin',
    						'jenis_pekerjaans.nama AS jenis_pekerjaan',    						
    						'status_keluargas.nama AS status_keluarga',
    						'lokasi_penduduk.lokasi_id'
    						));
    						    	
    	if(Input::get('fl_nik') != "") {
    		$penduduks = $penduduks->where('penduduks.nik', 'LIKE', '%'.Input::get('fl_nik').'%');
    	}
    	if(Input::get('fl_no_kk') != "") {
    		$penduduks = $penduduks->where('penduduks.no_kk', 'LIKE', '%'.Input::get('fl_no_kk').'%');	
    	}
    	if(Input::get('fl_jk') != "") {
    		$penduduks = $penduduks->where('penduduks.jenis_kelamin', '=', Input::get('fl_jk'));
    	}
		return Datatables::of($penduduks)->make();
    }    

    public function mappingPenduduks($id) 
    {
    	$lokasi = Lokasi::findOrFail($id);
    	
    	foreach (Input::get('selectedId') as $key => $value) {
    		if(!$lokasi->penduduks->contains($value)) {
    			$lokasi->penduduks()->sync(Input::get('selectedId'), false);    	
    		}else{
    			$lokasi->penduduks()->updateExistingPivot($value, array('is_active' => 1), false);		
    		}    		
    	}
    }

    public function unmappingPenduduk($id)
    {
    	$lokasi = Lokasi::findOrFail($id);
    	$lokasi->penduduks()->updateExistingPivot(Input::get('pendudukId'), array('is_active' => 0), false);
    }

    public function gis()
    {
    	$lingkungan = Lingkungan::active()->first()->toArray();
    	$tipes = Tipe::active()->get();

    	return View::make('lokasis.gis')->with(compact('lingkungan'))->with(compact('tipes'));   	    	    	
    }

    public function getAllMarkers()
    {    
    	$lokasi = Lokasi::active();	    	 

    	if(Input::get('fl_kipem_akan_habis') != "") {    			
    		$lokasi = $lokasi->whereHas('kipems', function($q){
	    		if(Input::get('fl_kipem_akan_habis') != "") {    			
	    			$q->where('tanggal_akhir', '<=', DB::raw('DATE_ADD(NOW(),INTERVAL 5 DAY)'));
	    			$q->where('tanggal_akhir', '>', DB::raw('DATE(NOW())'));
	    			$q->where('is_active', '=', '1');
	    		}
	    	});
    	}	    	

    	if(Input::get('fl_kipem_habis') != "") {    			
    		$lokasi = $lokasi->whereHas('kipems', function($q){
	    		if(Input::get('fl_kipem_habis') != "") {    			
	    			$q->where('tanggal_akhir', '=', DB::raw('DATE(NOW())'));	    			
	    			$q->where('is_active', '=', '1');
	    		}
	    	});
    	}

    	if(Input::get('fl_kipem_sudah_habis') != "") {    			
    		$lokasi = $lokasi->whereHas('kipems', function($q){
	    		if(Input::get('fl_kipem_sudah_habis') != "") {    			
	    			$q->where('tanggal_akhir', '<', DB::raw('DATE(NOW())'));	    			
	    			$q->where('is_active', '=', '1');
	    		}
	    	});
    	}	    	
    			
    	if(Input::get('fl_nama_lokasi') != "") {
    		$lokasi = $lokasi->where('nama', 'LIKE', '%'.Input::get('fl_nama_lokasi').'%');
    	}
    	if(Input::get('fl_tipe') != "") {
    		$lokasi = $lokasi->where('tipe_id', '=', Input::get('fl_tipe'));
    	}    	    	

    	return $lokasi->get();
    }

    public function getMarkerInfowindow()
    {
		$id        = Input::get('id');    	
		$lokasi    = Lokasi::findOrFail($id);
		$penduduks = $lokasi->penduduks;
		$pemilik   = Penduduk::findOrFail($lokasi->penduduk_id);
		
    	return View::make('lokasis.partials.marker-infowindow')
    		->with(compact('lokasi'))    		
    		->with(compact('penduduks'))
    		->with(compact('pemilik'));
    }    
}